home *** CD-ROM | disk | FTP | other *** search
Wrap
Library MapURL;// Header conversion by Stephen Genusa <steveg@onramp.net> 06/08/96. Thanks!!! MWT Uses SysUtils, Windows, Parser; const HTTP_FILTER_MAJOR = 1; { major version of this spec } HTTP_FILTER_MINOR = 0; { minor version of this spec } SF_MAX_USERNAME = 257; SF_MAX_PASSWORD = 257; SF_MAX_FILTER_DESC_LEN = 257; // SF_STATUS_TYPE SF_STATUS_TYPE = $8000000; { base value } SF_STATUS_REQ_FINISHED = SF_STATUS_TYPE; SF_STATUS_REQ_FINISHED_KEEP_CONN = SF_STATUS_TYPE + 1; SF_STATUS_REQ_NEXT_NOTIFICATION = SF_STATUS_TYPE + 2; SF_STATUS_REQ_HANDLED_NOTIFICATION = SF_STATUS_TYPE + 3; SF_STATUS_REQ_ERROR = SF_STATUS_TYPE + 4; SF_STATUS_REQ_READ_NEXT = SF_STATUS_TYPE + 5; SF_NOTIFY_SECURE_PORT = $00000001; SF_NOTIFY_NONSECURE_PORT = $00000002; SF_NOTIFY_READ_RAW_DATA = $00008000; SF_NOTIFY_PREPROC_HEADERS = $00004000; SF_NOTIFY_AUTHENTICATION = $00002000; SF_NOTIFY_URL_MAP = $00001000; SF_NOTIFY_SEND_RAW_DATA = $00000400; SF_NOTIFY_LOG = $00000200; SF_NOTIFY_END_OF_NET_SESSION = $00000100; SF_NOTIFY_ORDER_HIGH = $00080000; SF_NOTIFY_ORDER_MEDIUM = $00040000; SF_NOTIFY_ORDER_LOW = $00020000; SF_NOTIFY_ORDER_DEFAULT = SF_NOTIFY_ORDER_LOW; SF_NOTIFY_ORDER_MASK = (SF_NOTIFY_ORDER_HIGH or SF_NOTIFY_ORDER_MEDIUM or SF_NOTIFY_ORDER_LOW); type PVOID = Pointer; LPVOID = Pointer; PCardinal = ^Cardinal; SF_REQ_TYPE = (SF_REQ_SEND_RESPONSE_HEADER, SF_REQ_ADD_HEADERS_ON_DENIAL, SF_REQ_SET_NEXT_READ_SIZE, SF_REQ_SET_PROXY_INFO); TFuncPlaceHolder = POINTER; THTTP_FILTER_CONTEXT = record cbSize : DWORD; Revision : DWORD; ServerContext : PVOID; ulReserved : DWORD; fIsSecurePort : BOOL; pFilterContext : PVOID; GetServerVariable : TFuncPlaceHolder; {TGetServerVariable;} AddResponseHeaders : TFuncPlaceHolder; {TAddResponseHeaders;} WriteClient : TFuncPlaceHolder; {TWriteClient;} AllocMen : TFuncPlaceHolder; {TAllocMem;} ServerSupportFunc : TFuncPlaceHolder; {TServerSupportFunc;} end; HTTP_FILTER_CONTEXT = THTTP_FILTER_CONTEXT; PHTTP_FILTER_CONTEXT = ^HTTP_FILTER_CONTEXT; TGetServerVariable = Function(var pfc : THTTP_FILTER_CONTEXT; VariableName : PChar; Buffer : PChar; var BuffSize : DWORD) : BOOL; StdCall; TAddResponseHeaders = Function(var pfc : THTTP_FILTER_CONTEXT; Headers : PChar; Reserved : DWORD) : BOOL; StdCall; TWriteClient = Function(var pfc : THTTP_FILTER_CONTEXT; Buffer : LPVOID; dwBytes : LPDWORD; Reserved : DWORD) : BOOL; StdCall; TAllocMem = Procedure(var pfc : THTTP_FILTER_CONTEXT; cbSize : DWORD; dwReserved : DWORD); StdCall; TServerSupportFunc = Function(var pfc : THTTP_FILTER_CONTEXT; sfReq : SF_REQ_TYPE; pData : PVOID; ul1 : DWORD; ul2 : DWORD) : BOOL; StdCall; THTTP_FILTER_RAW_DATA = record pvInData : PVOID; cbInData : DWORD; cbInBuffer : DWORD; dwReserved : DWORD; end; HTTP_FILTER_RAW_DATA = THTTP_FILTER_RAW_DATA; PHTTP_FILTER_RAW_DATA = ^HTTP_FILTER_RAW_DATA; TGetHeader = Function(var pfc : THTTP_FILTER_CONTEXT; lpszName : PChar; lpvBuffer : LPVOID; lpdwSize : LPDWORD) : BOOL; StdCall; TSetHeader = Function(var pfc : THTTP_FILTER_CONTEXT; lpszName : PChar; lpszValue : PChar) : BOOL; StdCall; TAddHeader = Function(var pfc : THTTP_FILTER_CONTEXT; lpszName : PChar; lpszValue : PChar) : BOOL; StdCall; THTTP_FILTER_PREPROC_HEADERS = record GetHeader : TGetHeader; SetHeader : TSetHeader; AddHeader : TAddHeader; dwReserved : DWORD; end; HTTP_FILTER_PREPROC_HEADERS = THTTP_FILTER_PREPROC_HEADERS; PHTTP_FILTER_PREPROC_HEADERS = ^HTTP_FILTER_PREPROC_HEADERS; THTTP_FILTER_AUTHENT = record pszUser : PChar; cbUserBuff : DWORD; pszPassword : PChar; cbPasswordBuff : DWORD; end; HTTP_FILTER_AUTHENT = THTTP_FILTER_AUTHENT; PHTTP_FILTER_AUTHENT = ^HTTP_FILTER_AUTHENT; THTTP_FILTER_URL_MAP = record pszURL : PChar; pszPhysicalPath : PChar; cbPathBuff : DWORD; end; HTTP_FILTER_URL_MAP = THTTP_FILTER_URL_MAP; PHTTP_FILTER_URL_MAP = ^HTTP_FILTER_URL_MAP; THTTP_FILTER_LOG = record pszClientHostName : PChar; pszClientUserName : PChar; pszServerName : PChar; pszOperation : PChar; pszTarget : PChar; pszParameters : PChar; dwHttpStatus : DWORD; dwWin32Status : DWORD; end; HTTP_FILTER_LOG = THTTP_FILTER_LOG; PHTTP_FILTER_LOG = ^HTTP_FILTER_LOG; THTTP_FILTER_VERSION = record dwServerFilterVersion : DWORD; dwFilterVersion : DWORD; lpszFilterDesc : array [0..(SF_MAX_FILTER_DESC_LEN-1)] of Char; dwFlags : DWORD; end; HTTP_FILTER_VERSION = THTTP_FILTER_VERSION; PHTTP_FILTER_VERSION = ^HTTP_FILTER_VERSION; TFilter=class public procedure AssignContext(var thisFC: HTTP_FILTER_CONTEXT); function GetServerVar(varName: String): String; private pFC: PHTTP_FILTER_CONTEXT; end;// *******************// Start of code // *******************procedure TFilter.AssignContext(var thisFC: HTTP_FILTER_CONTEXT);begin pFC:=@thisFC;end;function TFilter.GetServerVar(varName: String): String;var ss: ShortString; buf: array[0..255] of char absolute ss; len: Integer; FNGetServerVariable: TGetServerVariable; begin len:=255; @FNGetServerVariable:=pFC^.GetServerVariable; if FNGetServerVariable(pFC^, PChar(varName), Pointer(@buf[1]), len ) then begin ss[0]:=Char(len); result:=ss; end else Result:='<UNKNOWN>'; end;Function GetFilterVersion(var pVer : HTTP_FILTER_VERSION) : BOOL; export; stdcall;begin pVer.dwFilterVersion := MAKELONG(0, 1); StrPCopy(pVer.lpszFilterDesc, 'Re-map URL version 0.2.'); pVer.dwFlags := (SF_NOTIFY_URL_MAP); result := True; end; function RemapURL(const url: String): String; var f: TextFile; bufLen: Integer; path: String[255]; lineBuf: String; inURL: String; outURL: String; begin Result:=''; // Create a data file in the same directory the DLL itself resides. bufLen:=GetModuleFileName( GetModuleHandle('MAPURL.DLL'), PChar(@path[1]), 255); SetLength(path, bufLen); path:=ExtractFilePath(path)+'#urlmap.txt'; // Create the file if it doesn't exist and load // it with some demo info if NOT FileExists(path) then begin AssignFile(f, path); try Rewrite(f); Writeln(f, '; INURL OUTURL'); Writeln(f, '; remap.htm c:\autoexec.bat A request for remap.htm (in the server root) will send back your autoexec.bat file'); Writeln(f, ';'); Writeln(f, '; DELETE THIS NEXT LINE!!! It is for demo purposes only'); Writeln(f, 'remap.htm c:\autoexec.bat'); CloseFile(f); except ; end; exit; end; AssignFile(f, path); try Reset(f); try while (not EOF(f)) do begin // Read a line Readln(f, lineBuf); // Skip if it's a comment if (Length(lineBuf)>0) AND (lineBuf[1]=';') then continue; // Parse inURL:=UpperCase(GetToken(lineBuf, 1, [' '])); outURL:=UpperCase(GetToken(lineBuf, 2, [' '])); // Should we remap? if Pos(inURL, url)=1 then begin Result:=outURL+Copy(url, Length(inURL)+1, 255); break; end; end; finally CloseFile(f); end; except ; end; end; Function HttpFilterProc(var pfc : HTTP_FILTER_CONTEXT; NotificationType : DWORD; pvNotification : LPVOID) : DWORD; export; stdcall;var filter: TFilter; function OnURLMap : DWORD; var mapStruct: PHTTP_FILTER_URL_MAP; url: String; begin result := SF_STATUS_REQ_NEXT_NOTIFICATION; mapStruct:=PHTTP_FILTER_URL_MAP(pvNotification); // Extract the path info we need to try and map url:=UpperCase( String(mapStruct.pszURL) ); // Does this map? url:=RemapURL(url); // If it maps, then copy it if url<>'' then StrCopy(mapStruct.pszPhysicalPath, PChar(url) ); end; begin result:=SF_STATUS_REQ_NEXT_NOTIFICATION; //Exit; try filter:=TFilter.Create; filter.AssignContext(pfc); Case NotificationType of SF_NOTIFY_URL_MAP: begin result:=OnURLMap; end; end; filter.Free; except ; end; end; exports HttpFilterProc, GetFilterVersion; end.